package 面试经典150题.矩阵;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * @author tmh
 * @date 2024/6/19 21:15
 * @description
 */
public class T54螺旋矩阵 {
    public List<Integer> spiralOrder(int[][] matrix) {
        //判断矩阵是否是为空，为空的话 直接返回一个空集合
        if (matrix == null) {
            return new ArrayList<>();
        }
        //定义四个变量，分别保存上下左右的起始位置
        //上--第一层  其实位置为0  下--最后一层 起始位置matrix.length-1
        //左--最左面 起始位置0     右--最右边  起始位置matrix[0].length-1
        int top = 0, bottom = matrix.length - 1, left = 0, right = matrix[0].length - 1;
        //定义一个数组保存所有元素
        Integer[] result = new Integer[(bottom + 1) * (right + 1)];
        //定义一个变量x，记录数组插入的位置
        int x =0;
        //记住一个规则，在哪个方位操作的时候，哪个方位的变量就不动
        //例如:操作第一行的时候，水平方向在动，那么就操作数组里面的第二个[]，top就保持不变
        while (true){
            //操作：上
            for(int i =left;i<=right;i++){
                result[x++]=matrix[top][i];
            }
            //操作完top之后，top要进行++，然后判断top和bottom之间的关系
            if(++top>bottom){
                break;
            }
            //操作：右
            for(int  i =top;i<=bottom;i++){
                result[x++]=matrix[i][right];
            }
            //right--，判断left和right之间的关系
            if(left>--right){
                break;
            }
            //操作：下
            for(int i = right;i>=left;i--){
                 result[x++]=matrix[bottom][i];
            }
            //bottom--
            if(top>--bottom){
                break;
            }
            //操作：左
            for(int i=bottom;i>=top;i--){
                result[x++]=matrix[i][left];
            }
            //left++
            if(++left>right){
                break;
            }
        }
        return Arrays.asList(result);
    }
}
